package lanxing.future.base.chapter10;

/**
 * @author <a href="mailto:lanxing@chances.com.cn">lanxing</a>
 * @version 2019年4月3日
 *
 */
interface Incrementable{
    void increment();
}

class Callee1 implements Incrementable{
    private int i=0;
    public void increment() {
        i++;
        System.out.println(i);
    }
}

class MyIncrement {
    public void increment() {
        System.out.println("some other oper");
    }
    
    static void f(MyIncrement m) {
        m.increment();
    }
}

class Callee2 extends MyIncrement {
    private int i = 0;
    public void increment() {
        super.increment();
        i++;
        System.out.println(i);
    }
    
    private class Closure implements Incrementable{

        /* (non-Javadoc)
         * @see lanxing.future.base.chapter10.Incrementable#increment()
         */
        @Override
        public void increment() {
            // TODO Auto-generated method stub
            Callee2.this.increment();
        }
    }
    
    Incrementable getCallbackReference(){
        return new Closure();
    }
}

class Caller{
    private Incrementable callbackReference;
    Caller(Incrementable cbh){
        this.callbackReference = cbh;
    }
    
    void go() {
        callbackReference.increment();
    }
}

public class CallBacks {
    public static void main(String[] args) {
        Callee1 c1 = new Callee1();
        Callee2 c2 = new Callee2();
        MyIncrement.f(c2);
        
        Caller caller1 = new Caller(c1);
        Caller caller2 = new Caller(c2.getCallbackReference());
        
        caller1.go();
        caller1.go();
        caller2.go();
        caller2.go();
        
        
        
    }
}


